package com.xjh.basestudy.designmode.behaviorMode.behaviorMode10_Observer.p2_observer;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author XuJianHua
 * @Date 2022/10/6 21:42
 * @Description 商店类Shop在第4行以List<Buyer>类型定义了一个买家预订清单，里面记录着所有预订商品的买家，并在第12行提供商品预订的注册方法register()，
 * 所有关注商品的买家都可以调用这个方法进行预订注册，加入买家预订清单。在商品到货后，商店在第22行主动通知买家，调用通知方法notifyBuyers()，进一步至第27行对所有预订买家进行迭代，
 * 并依次调用买家的inform()方法将商品传递过去即可。此处假设商品不限量，我们就不做过多的细节展开了，
 * 请读者自行增强。可以看到，对于买家必须要拥有方法inform()，这也是对各类买家的行为规范。基于此，我们对买家类进行抽象重构，这里我们用抽象类来定义买家类Buyer
 */
public class Shop {

    private String product;
    private List<Buyer> buyers;// 预订清单

    public Shop() {
        this.product = "无商品";
        this.buyers = new ArrayList<>();
    }

    public String getProduct() {
        return product;
    }
    // 注册方法：所有需要购买商品的购买者都需要在商店注册（将购买者加入到商店的list属性中）
    // 注册买家到预订清单中
    public void register(Buyer buyer) {
        this.buyers.add(buyer);
    }
    // 给商店设置商品时，额外调用notifyBuyers方法，通知卖家到货
    public void setProduct(String product) {
        this.product = product;// 到货了
        notifyBuyers();// 到货后通知买家
    }

    // 通知所有注册买家，通知方法中遍历购买者，调用每个购买者的购买方法去购买商品
    public void notifyBuyers() {
        buyers.stream().forEach(b -> b.inform(this.getProduct()));
    }
}